//67. 二进制求和
//思路：1.先将两个字符串反序，然后将两个二进制字符串从头开始加（反序后的字符串头是二进制的个位）
//2.我们将进位保存到carry变量中，carry%2 就是相加的值
//3.更新carry，carry /= 10，循环步骤2，3
//4.判断最后一个carry，如果存在，就给ret[len++] = '1'，最后再给最后个位置保存'\0'
//5.最后再将开辟的字符数组逆置，再返回

#include <string.h>
#include <stdlib.h>
#include <math.h>

void reverse(char* s)
{
    int left = 0, right = strlen(s) - 1;
    while (left < right)
    {
        char tmp = s[left];
        s[left] = s[right];
        s[right] = tmp;

        left++;
        right--;
    }
}
char* addBinary(char* a, char* b) {
    reverse(a);
    reverse(b);

    int lena = strlen(a);
    int lenb = strlen(b);
    int n = fmax(lena, lenb);
    int len = 0, carry = 0;
    char* ret = (char*)malloc(sizeof(char) * (n + 2));

    for (int i = 0; i < n; i++)
    {
        //细节：三目操作符可以做到，当短字符串已经遍历完后继续遍历长字符串
        carry += i < lena ? (a[i] - '0') : 0;//细节：'1'-'0'，可以将字符数字转换为数学数字
        carry += i < lenb ? (b[i] - '0') : 0;
        ret[len++] = carry % 2 + '0';//再将数学数字转化为字符数字
        carry /= 2;//进位/2 ，不应该是/10
    }
    if (carry)
        ret[len++] = '1';
    ret[len] = '\0';
    //最后再将保存的字符串逆置
    reverse(ret);

    return ret;
}